from concurrent.futures import ThreadPoolExecutor, as_completed
import numpy as np
import cv2


def parallel_ocr_recognize(ocr, img, boxes, max_workers=4):
    """
    有一张大图，里面检测出了很多文本框（比如图片里的多段文字），
    你想快速识别每个框里的文字，
    使用这个函数就可以轻松做到多线程并发识别，比逐个识别快很多



    多线程并发识别多个检测框对应的图像区域。

    ocr: OCRWrapper对象，必须有recognize_text(img)方法
    img: numpy图像
    boxes: 检测框列表，每个框为4点坐标[[x1,y1],[x2,y2],[x3,y3],[x4,y4]]
    max_workers: 最大线程数
    """

    def recognize_box(box):
        pts = np.array(box, dtype=np.int32)
        x, y, w, h = cv2.boundingRect(pts)
        roi = img[y:y + h, x:x + w].copy()
        texts = ocr.recognize_text(roi)
        if texts:
            return {'text': texts[0][0], 'score': texts[0][1], 'box': box}
        else:
            return {'text': '识别失败', 'score': 0, 'box': box}

    results = []
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = [executor.submit(recognize_box, box) for box in boxes]
        for future in as_completed(futures):
            results.append(future.result())

    return results